package cn.schoolwow.quickdao.module.database.ddl.action.kit;

import cn.schoolwow.quickdao.domain.database.ddl.IndexField;
import cn.schoolwow.quickdao.domain.entity.Entity;
import cn.schoolwow.quickdao.domain.entity.Property;
import cn.schoolwow.quickdao.domain.entity.PropertyOption;
import cn.schoolwow.quickdao.domain.entity.common.TableColumn;
import cn.schoolwow.quickdao.domain.entity.create.CreateTableRequest;

/**
 * 数据定义语言-更新接口
 */
public interface DatabaseDefinitionAction {
    /**
     * 建表
     */
    void create(Class clazz);

    /**
     * 建表
     */
    void create(Entity entity);

    /**
     * 建表
     */
    void createTable(CreateTableRequest createTableRequest);

    /**
     * 重命名表
     */
    void renameTable(String oldTableName, String newTableName);

    /**
     * 删表
     */
    void dropTable(Class clazz);

    /**
     * 删表
     */
    void dropTable(String tableName);

    /**
     * 重建表
     */
    void rebuild(Class clazz);

    /**
     * 重建表
     */
    void rebuild(String tableName);

    /**
     * 新增列
     *
     * @param tableName 表名
     * @param propertyOption  字段属性
     * @return 新增列
     */
    void createColumn(String tableName, PropertyOption propertyOption);

    /**
     * 新增列
     *
     * @param tableName 表名
     * @param tableColumn  字段属性
     * @return 新增列
     */
    void createColumn(String tableName, TableColumn tableColumn);

    /**
     * 重命名列
     * @param tableName 表名
     * @param oldTableColumn 旧表名称
     * @param newTableColumn 新表名称
     */
    void renameTableColumn(String tableName, String oldTableColumn, String newTableColumn);

    /**
     * 修改列
     * @param tableName 表名
     * @param propertyOption 列信息
     */
    void alterColumn(String tableName, PropertyOption propertyOption);

    /**
     * 删除列
     *
     * @param tableName  表名
     * @param columnName 列名
     */
    Property dropColumn(String tableName, String columnName);

    /**
     * 新增索引
     *
     * @param indexField 索引信息
     */
    void createIndex(IndexField indexField);

    /**
     * 删除索引
     *
     * @param tableName 表名
     * @param indexName 索引名称
     */
    void dropIndex(String tableName, String indexName);

    /**
     * 创建外键约束
     *
     * @param tableName 表名
     * @param propertyOption 外键信息
     */
    void createForeignKey(String tableName, PropertyOption propertyOption);

    /**
     * 是否开启外键约束检查
     */
    void enableForeignConstraintCheck(boolean enable);

    /**
     * 备份表
     *
     * @param tableName 需要备份的表
     * @param backupTableName 创建的备份表名称
     */
    void backupTable(String tableName, String backupTableName);

    /**
     * 删除数据库表信息缓存
     * @param tableNames 需要删除的数据库表列表,为空表示全部删除
     *
     */
    void deleteDatabaseEntityCache(String... tableNames);

}
